package com.ufcg.lvc.client.prototipacao;

import java.util.ArrayList;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.ufcg.lvc.client.GreetingService;
import com.ufcg.lvc.client.GreetingServiceAsync;
import com.ufcg.lvc.client.GreetingServiceCRUD;
import com.ufcg.lvc.client.GreetingServiceCRUDAsync;
import com.ufcg.lvc.client.UserData;
import com.ufcg.lvc.client.MyListGrids.ModelosDeProvaListGrid;

public class NovaProva {

	private AbsolutePanel painelNovaQuestao;
	private Label lblTitulo;
	private TextBox tituloTB;
	private TextArea cabelcalhoTA;
	private Button btnCancelar;
	private ModelosDeProvaListGrid listGrid;
	String nome_, disciplina_, instituicao_, ano_;
	String cabecalho = "";
	ArrayList<String> sustitulos = new ArrayList<String>(); 
	UserData UD;
	public static GreetingServiceCRUDAsync getServicoCRUD() {
		return GWT.create(GreetingServiceCRUD.class);
	}

	public static GreetingServiceAsync getServico() {
		return GWT.create(GreetingService.class);
	}
	
	public NovaProva(String nome, String disciplina, String instituicao, String ano,UserData uD) {
		UD = uD;
		nome_ = nome;
		disciplina_ = disciplina;
		instituicao_ = instituicao; 
		ano_ = ano;
		
		getServicoCRUD().getProvasSubtitulos(nome, UD.getId_usuario(), new AsyncCallback<ArrayList<String>>() {
			@Override
			public void onSuccess(ArrayList<String> result) {
				sustitulos = result;
			}
			
			@Override
			public void onFailure(Throwable caught) {
				System.out.println(caught.getMessage());
			}
		});
		draw(nome_);
	}

	/** Densenhar tela nova questao */
	public void draw(final String nome) {
		// Desenhar tela nova questao - inicio
		painelNovaQuestao = new AbsolutePanel();
		painelNovaQuestao.setSize("900px", "707px");
		lblTitulo = new Label("Nova prova");
		lblTitulo.setStyleName("gwt-TituloMedio");
		painelNovaQuestao.add(lblTitulo, 0, 10);

		Label lblTituloQuestao = new Label("Título da prova:");
		painelNovaQuestao.add(lblTituloQuestao, 60, 69);
		lblTituloQuestao.setSize("165px", "17px");

		Label lblCabecalho = new Label("Cabeçalho:");
		painelNovaQuestao.add(lblCabecalho, 60, 109);
		lblCabecalho.setSize("165px", "17px");

		Label lblEnunciado = new Label("Modelo de prova:");
		painelNovaQuestao.add(lblEnunciado, 60, 288);
		lblEnunciado.setSize("165px", "17px");

		tituloTB = new TextBox();
		painelNovaQuestao.add(tituloTB, 235, 69);
		tituloTB.setSize("440px", "14px");

		cabelcalhoTA = new TextArea();
		painelNovaQuestao.add(cabelcalhoTA, 235, 109);
		cabelcalhoTA.setSize("440px", "153px");

		getServicoCRUD().getCabecalhoInstituicao(instituicao_, UD.getId_usuario(), new AsyncCallback<String>() {
			
			@Override
			public void onSuccess(String result) {
				cabecalho += result + "\r\n\r\n";
				
				getServicoCRUD().getNomeUsuario(UD.getId_usuario(), new AsyncCallback<String>() {
					@Override
					public void onSuccess(String result) {
						cabecalho += "Professor(a): " + result + "\r\nDisciplina: " + disciplina_+ "\r\nData: ___/___/"+ano_;
						cabelcalhoTA.setText(cabecalho );
					}
					@Override
					public void onFailure(Throwable caught) {
					}
				});
			}
			
			@Override
			public void onFailure(Throwable caught) {
			}
		});
		
		listGrid = new ModelosDeProvaListGrid(getServicoCRUD(), UD);
		listGrid.setSize("445px", "153px");
		painelNovaQuestao.add(listGrid, 235, 288);
		
		btnCancelar = new Button("Cancelar");
		painelNovaQuestao.add(btnCancelar, 457, 500);
		btnCancelar.setSize("81px", "30px");
		
		final Button btnSalvar = new Button("Salvar");
		painelNovaQuestao.add(btnSalvar, 370, 500); 
		btnSalvar.setSize("81px", "30px");
		
		btnCancelar.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				voltar();	
			}
		});
	
		btnSalvar.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
			
				try {
					ListGridRecord elem = listGrid.getSelectedRecord();
//					final String texto = tituloTB.getText() + "\r\n" + cabelcalhoTA.getText();
					if (!tituloTB.getText().trim().equals("")){
						if (!sustitulos.contains(tituloTB.getText())) {
							final String texto = cabelcalhoTA.getText();
							getServicoCRUD().salvarProva(tituloTB.getText(), texto , nome, elem.getAttribute("titulo").toString(), UD.getId_usuario(), UD.getLogin_usuario(), new AsyncCallback<String>() {
								
								@Override
								public void onFailure(Throwable caught) {
									com.google.gwt.user.client.Window.alert("Erro a gerar provas.");
								}
			
								@Override
								public void onSuccess(String result) {
									Window.alert("Provas geradas com sucesso!");
									getServicoCRUD().gerarLink(tituloTB.getText(), UD.getId_usuario(), new AsyncCallback<String>() {
										@Override
										public void onSuccess(String result) {
											Window.open(GWT.getHostPageBaseURL()+UD.getLogin_usuario()+"_"+tituloTB.getText()+".zip", "_blank", "enabled");
											System.out.println(GWT.getHostPageBaseURL()+UD.getLogin_usuario()+"_"+tituloTB.getText()+".zip");
											voltar();
										}
										
										@Override
										public void onFailure(Throwable caught) {
											Window.alert("Erro ao gerar link para download. Tente novamente mais tarde.");
											voltar();
										}
									});
								}
							});
							
						}else {
							Window.alert("Já existe uma prova com esse título nesta turma. Escolha um novo título para a prova.");	
						}
						
					} else {
						Window.alert("O campo título deve ser preenchido.");
					}
				} catch (Exception e) {
					Window.alert("Selecione um modelo de prova.");
				}
			}
		});

	}// Draw - fim

	public AbsolutePanel getPanel() {
		return painelNovaQuestao;
	}
	
	public void voltar(){
		painelNovaQuestao.clear();
		ExibirTurma e = new ExibirTurma(nome_, disciplina_, instituicao_, ano_, UD);
		painelNovaQuestao.add(e.getPanel());
	}
}

